/*************************************************************************************
 *
 *	模块名称 : 词典模块
 *	文件名称 : dict.c
 *	版   本 : V1.0
 *	说   明 : 根据用户输入单词查找词典并打印单词类型和释义。
 *	修改记录 :
 *		     版本号       日期         作者        说明
 *	         V1.0     2022-05-12      YT        发布
 *
 *	Copyright (C), 2022-2030, xxxx
 *
 *************************************************************************************/

#include "inc.h"
#include "dict.h"

static sqlite3 *gs_dbDict = NULL; // 定义 词典数据库指针 为全局静态变量

int dictOpen()
{
    int Ret = sqlite3_open(DICT_DB_NAME, &gs_dbDict);
    if (Ret != SQLITE_OK)
    {
        fprintf(stderr, "fail sqlite3_open: %s\n", sqlite3_errmsg(gs_dbDict));
        return -1;
    }
    return 0;
}

int dictClose()
{
    sqlite3_close(gs_dbDict);

    return 0;
}

int dictIsExitWord(const char strWord[])
{
    return strcmp(strWord, STR_EXIT);
}

static int SelectCallback(void *arg, int n, char **pContent, char **pTitle)
{
    WordFormatTypedef *pFmtWord = (WordFormatTypedef *)arg;
    strcpy( pFmtWord->Word,  pContent[1] );
    strcpy( pFmtWord->Type,  pContent[2] );
    strcpy( pFmtWord->Expln, pContent[3] );

    return 0;
}

int dictFindWord(const char strUsrWord[], WordFormatTypedef *pFmtWord)
{
    char strDictWordLine[MAX_WORD_STR_SIZE] = {0}; //定义字符数组，保存从词典中读取的每行数据
    char *pDict = NULL;

    memset(pFmtWord, 0, sizeof(WordFormatTypedef)); //清空单词结构体

    //在 词典数据库文件 dict.db 中查找单词, 并填充 单词结构体
    char SqlSelectStatements[1024] = {0};
    char *strErrMsg;
    int Ret;

    sprintf( SqlSelectStatements,
            "SELECT * FROM DTABLE WHERE Word = \"%s\";", strUsrWord );

    Ret = sqlite3_exec(gs_dbDict, SqlSelectStatements, SelectCallback, (void *)pFmtWord, &strErrMsg);
    if (Ret != SQLITE_OK)
    {
        fprintf(stderr, "fail sqlite3_exec select: %s\n", strErrMsg);
        sqlite3_free(strErrMsg);
        return -1;
    }

}

int dictPrintWord(const WordFormatTypedef *pFmtWord)
{
    if (pFmtWord->Word[0] != 0) //正常单词结构体
    {
        printf("Word   : %s\nType   : %s\nExplain: %s\n======================================\n",
               pFmtWord->Word, pFmtWord->Type, pFmtWord->Expln);
        return 0;
    }
    else //空单词结构体
    {
        printf("***Empty Word in Dict***\n======================================\n");
        return -1;
    }
}
